package com.nuyoah.controller;


import com.nuyoah.common.dto.StatisticsDto;
import com.nuyoah.common.lang.Result;
import com.nuyoah.entity.ScoreRecord;
import com.nuyoah.entity.Statistics;
import com.nuyoah.service.StatisticsService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.math.BigDecimal;
import java.util.List;

/**
 * 对学习和竞赛成绩的统计分析数据
 *
 * @author xyx
 * @since 2024-06-03
 */
@RestController
@RequestMapping("/statistics")
public class StatisticsController {

    @Autowired
    private StatisticsService statisticsService;

    StatisticsDto statisticsDto;

    //获取统计分析数据接口

    /**
     * 根据用户ID获取学习和竞赛成绩的统计分析数据。
     * 此方法通过@RequestMapping注解映射到URL "/getAnalysisData"，用于处理对应的HTTP请求。
     * 请求参数userId通过@RequestParam注解绑定到方法参数，用于指定要获取分析数据的用户。
     *
     * @param userId 用户ID，用于标识要获取分析数据的特定用户。
     * @return 返回包含统计分析数据的结果对象。如果操作成功，结果对象中的data字段将包含统计数据；
     *         如果操作失败，结果对象将包含错误信息。
     */
    @RequestMapping("/getAnalysisData")
    public Result getAnalysisData(@RequestParam("userId") Integer userId) {
        // 调用统计服务，根据用户ID获取统计分析数据
        List<Statistics> statistics = statisticsService.getAnalysisData(userId);
        // 构建并返回操作结果对象，将获取到的统计分析数据作为结果的一部分
        return Result.succ(statistics);
    }

    /**
     * 统计指定学生的平时成绩信息。
     * 通过学生ID查询学生的平时成绩列表，并计算出平均分、最高分、最低分。
     * @param studentId 学生的唯一标识ID。
     * @return 包含统计结果的Result对象。
     */
//统计指定学生的平时成绩接口
    @RequestMapping("/getRegular")
    public Result getRegular(@RequestParam("studentId") Integer studentId) {
        // 根据studentId获取学生的平时成绩列表
        //先根据studentId获取学生的平时成绩列表
        List<ScoreRecord> scoreRecords = statisticsService.getRegular(studentId,"Regular");
        // 初始化统计DTO对象
        //根据所有成绩列表，计算平均分、最高分、最低分
        statisticsDto = new StatisticsDto();
        // 计算并保存平均分
        statisticsService.save(statisticsDto.getAverage(studentId,"StudentGrade",scoreRecords));
        // 计算并保存最高分
        statisticsService.save(statisticsDto.getHighest(studentId,"StudentGrade",scoreRecords));
        // 计算并保存最低分
        statisticsService.save(statisticsDto.getLowest(studentId,"StudentGrade",scoreRecords));
        // 返回统计结果
        //返回结果对象
        return Result.succ(statisticsDto);
    }

    /**
     * 统计指定学生的竞赛成绩信息。
     * 通过学生ID查询学生的竞赛成绩列表，并计算出平均分、最高分、最低分。
     * @param studentId 学生的唯一标识ID。
     * @return 包含统计结果的Result对象。
     */
//统计指定学生的竞赛成绩接口
    @RequestMapping("/getCompetition")
    public Result getCompetition(@RequestParam("studentId") Integer studentId) {
        // 根据studentId获取学生的竞赛成绩列表
        //先根据studentId获取学生的竞赛成绩列表
        List<ScoreRecord> scoreRecords = statisticsService.getCompetition(studentId,"Competition");
        // 初始化统计DTO对象
        //根据所有成绩列表，计算平均分、最高分、最低分
        statisticsDto = new StatisticsDto();
        // 计算并保存平均分
        statisticsService.save(statisticsDto.getAverage(studentId,"CompetitionResult",scoreRecords));
        // 计算并保存最高分
        statisticsService.save(statisticsDto.getHighest(studentId,"CompetitionResult",scoreRecords));
        // 计算并保存最低分
        statisticsService.save(statisticsDto.getLowest(studentId,"CompetitionResult",scoreRecords));
        // 返回统计结果
        //返回结果对象
        return Result.succ(statisticsDto);
    }

    /**
     * 统计指定学生的总成绩信息。
     * 通过学生ID查询学生的总成绩列表，并计算出平均分、最高分、最低分。
     * @param studentId 学生的唯一标识ID。
     * @return 包含统计结果的Result对象。
     */
//统计指定学生的总成绩接口
    @RequestMapping("/getTotal")
    public Result getTotal(@RequestParam("studentId") Integer studentId) {
        // 根据studentId获取学生的总成绩列表
        //先根据studentId获取学生的总成绩列表
        List<ScoreRecord> scoreRecords = statisticsService.getTotal(studentId);
        // 初始化统计DTO对象
        //根据所有成绩列表，计算平均分、最高分、最低分
        statisticsDto = new StatisticsDto();
        // 计算并保存平均分
        statisticsService.save(statisticsDto.getAverage(studentId,"TotalGrade",scoreRecords));
        // 计算并保存最高分
        statisticsService.save(statisticsDto.getHighest(studentId,"TotalGrade",scoreRecords));
        // 计算并保存最低分
        statisticsService.save(statisticsDto.getLowest(studentId,"TotalGrade",scoreRecords));
        // 返回统计结果
        //返回结果对象
        return Result.succ(statisticsDto);
    }


}
